//package com.ruoyi.framework.mybatis;
//
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.executor.parameter.ParameterHandler;
//import org.apache.ibatis.executor.resultset.ResultSetHandler;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Plugin;
//import org.apache.ibatis.plugin.Signature;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//
//import java.lang.reflect.Method;
//import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.Statement;
//import java.util.Properties;
//
///*
//MyBatis拦截器默认会按顺序拦截以下的四个接口中的所有方法
//
//org.apache.ibatis.executor.Executor  //拦截执行器方法
//org.apache.ibatis.executor.statement.StatementHandler  //拦截SQL语法构建处理
//org.apache.ibatis.executor.parameter.ParameterHandler  //拦截参数处理
//org.apache.ibatis.executor.resultset.ResultSetHandler  //拦截结果集处理
//
//具体是拦截这四个接口对应的实现类
//
//org.apache.ibatis.executor.CachingExecutor
//org.apache.ibatis.executor.statement.RoutingStatementHandler
//org.apache.ibatis.scripting.defaults.DefaultParameterHandler
//org.apache.ibatis.executor.resultset.DefaultResultSetHandler
//
//*/
//
//@Intercepts({
//    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
//    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
//    @Signature(type = ParameterHandler.class, method = "setParameters", args = {PreparedStatement.class}),
//    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
//})
//public class MyPlugin implements Interceptor {
//
//    Properties properties = null;
//
//    /**
//     * 拦截方法逻辑
//     * 这里主要是通过反射去获取要执行的SQL相关信息，然后进行操作
//     */
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        Object target = invocation.getTarget();//被代理对象
//        Method method = invocation.getMethod();//代理方法
//        Object[] args = invocation.getArgs();//方法参数
//        // do something ...... 方法拦截前执行代码块
//        Object result = invocation.proceed();
//        // do something .......方法拦截后执行代码块
//        return result;
//    }
//
//    /**
//     * 生成MyBatis拦截器代理对象
//     */
//    @Override
//    public Object plugin(Object target) {
//        if(target instanceof StatementHandler){
//            //调用插件
//            return Plugin.wrap(target, this);
//        }
//        return target;
//    }
//
//    /**
//     * 设置插件属性（直接通过Spring的方式获取属性，所以这个方法一般也用不到）
//     * 项目启动的时候数据就会被加载
//     */
//    @Override
//    public void setProperties(Properties properties) {
//        //赋值成员变量，在其他方法使用。
//        this.properties = properties;
//    }
//}
